把產線上的瑕疵檢驗儀標準調到最低,當然每個出廠的都是良品。爛的 AI 寫的測試就是那台壞掉的檢驗儀,所有垃圾都 all passed
在工業工程(IE)裡,我們非常看重品檢站(Inspection Station)的可靠度。如果檢驗儀器本身沒有經過校正(Calibration),那你測出來的 Cpk(製程能力指數)再高都是假的。
現在的工程師太依賴 Copilot 或 Gemini 來補 Unit Test。像是說你給它一個 Function,按個 Tab,它瞬間幫你生出十幾個 Test Cases。但你仔細看過它到底在測什麼嗎?AI 為了確保測試「會過」,最喜歡偷偷做兩件事:
無腦 Over-mocking:把所有外部依賴、連同你要測的核心邏輯,全部用 Mock 給 stub 掉,最後根本是在測 Python 的 MagicMock 或是 Java 的 Mockito 會不會動。
同源謬誤的 Assert:如果 AI 在 Production Code 裡把「1+1 算成 3」,它在 Test Code 裡就會理直氣壯地寫下 assert result == 3.
這種測試在產線上叫做「虛假防呆(Fake Poka-Yoke)」。表面上 Pipeline 跑完了,Coverage 很高,但當真實使用者的異常 Payload 打進來時,系統照樣死給你看。測試真正的目的不是為了證明 Code「會動」,而是為了找出 Code「什麼時候會死」
我們來看一個真實發生的慘案。這是一個處理訂單折扣的簡單邏輯,我們來看看 AI 會生出什麼樣的垃圾測試,以及我們該怎麼把它改成真正有防禦力的寫法。
# AI 為了讓測試過,直接把核心的算錢邏輯 Mock 掉 lol
@patch('order_service.calculate_discount')
def test_apply_discount(mock_calculate):
# Setup
mock_calculate.return_value = 100 # 這邊直接寫死回傳值
order = Order(total=500)
# Execute
result = apply_discount(order)
# Assert
assert result == 100 # XD
mock_calculate.assert_called_once_with(order)
這種測試就算跑一萬遍都是綠燈,但如果 calculate_discount 裡面發生 Float 浮點數精度遺失,這個測試完全抓不到!
工業級的防呆測試(拒絕無腦 Mock,強調 State Verification):
我們在設定測試框架時,必須強制剝奪 AI 亂 Mock 的權利。測試應該要驗證「狀態(State)」跟「邊界(Boundary)」,而不是只驗證「行為有沒有被呼叫」。
def test_apply_discount_with_edge_cases():
# 不准 Mock 核心的 Domain Logic,傳入真實或極端的 Value Object
order_normal = Order(total=Decimal('500.00'), user_tier='VIP')
order_zero = Order(total=Decimal('0.00'), user_tier='NORMAL')
order_negative = Order(total=Decimal('-50.00'), user_tier='VIP')
# 驗證極限公差
assert apply_discount(order_normal).final_price == Decimal('450.00')
assert apply_discount(order_zero).final_price == Decimal('0.00')
# 驗證預期內的 Exception 是否正確噴出 (Fail-Fast 機制)
with pytest.raises(InvalidOrderAmountException):
apply_discount(order_negative)